﻿using OT.HikiSecureCenterApis.Req;
using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.Video.Req;
using OT.HikiSecureCenterApis.Service.Video.Res;
namespace OT.HikiSecureCenterApis.Service.Video
{
    /// <summary>
    /// 视频应用服务 --> 电视墙 未完成
    /// </summary>
    public partial class VideoService
    {
        /// <summary>
        /// 获取电视墙大屏信息 /api/tvms/v1/tvwall/allResources
        /// 1.在电视墙客户端配置相关电视墙所需的信息：如添加电视墙、添加解码器、关联输出通道，配置场景信息。
        /// 2.调用获取电视墙所有的资源数据的接口。
        /// 3.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 4.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<ResTVWallAllResources>?> TVWallAllResourcesAsync() =>
          await SecureCenterApis.PostAsync<ResTVWallAllResources>("/api/tvms/v1/tvwall/allResources", 1.4);
        /// <summary>
        /// 获取电视墙场景列表信息 /api/tvms/v1/tvwall/scenes
        /// 1.在电视墙客户端配置电视墙的场景信息。
        /// 2.获取电视墙所有的场景列表信息。
        /// 3.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 4.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<ResTVWallSecenes>?> TVWallSecenesAsync() =>
          await SecureCenterApis.PostAsync<ResTVWallSecenes>("/api/tvms/v1/tvwall/scenes", 1.2);
        /// <summary>
        /// 获取电视墙窗口信息列表 /api/tvms/v1/tvwall/wnds/get
        /// 1.在电视墙客户端上添加解码器和电视墙，并关联解码器的输出通道至电视墙上。
        /// 2.在电视墙上进行开窗操作。
        /// 3.调用获取窗口列表信息接口。
        /// 4.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 5.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="dlp_id">电视墙id，若为空，则返回该服务下所有窗口列表。从获取电视墙大屏信息接口获取返回参数dlp_id</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<ResGetTVWallWnds>?> GetTVWallWndsAsync(int dlp_id) =>
          await SecureCenterApis.PostAsync<ResGetTVWallWnds>("/api/tvms/v1/tvwall/wnds/get", 1.3, new { dlp_id = dlp_id });
        /// <summary>
        /// 批量上墙 /api/tvms/v1/tvwall/realplay/add
        /// 1.在电视墙客户端上添加解码器和电视墙，并关联解码器的输出通道至电视墙上。
        /// 2.在电视墙上进行开窗操作。
        /// 3.调用窗口上墙接口（支持批量上墙）。
        /// 4.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 5.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">上墙窗口和监控点位信息</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<ResTVWalRealplayAdd>?> GetTVWalRealplayAddAsync(IList<ReqTVWalRealplayAdd> req) =>
          await SecureCenterApis.PostAsync<ResTVWalRealplayAdd>("/api/tvms/v1/tvwall/realplay/add", 1.3, new { realplay_list = req });
        /// <summary>
        /// 批量下墙 /api/tvms/v1/tvwall/realplay/delete
        /// 1.在电视墙客户端上添加解码器和电视墙，并关联解码器的输出通道至电视墙上。
        /// 2.在电视墙上进行开窗上墙操作或调用窗口上墙接口。
        /// 3.调用窗口下墙接口（支持批量下墙）。
        /// 4.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 5.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="wnd_uri">窗口Uri,作为窗口唯一标识，从获取电视墙窗口信息列表接口获取返回参数wnd_uri</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<ResTVWalRealplayAdd>?> GetTVWalRealplayDelAsync(IList<string> wnd_uri) =>
          await SecureCenterApis.PostAsync<ResTVWalRealplayAdd>("/api/tvms/v1/tvwall/realplay/delete", 1.3, new
          {
              realplay_list = wnd_uri.Select(o => new { wnd_uri = o }).ToList(),
          });
        /// <summary>
        /// 场景创建 /api/tvms/v1/public/tvwall/scene/addition
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.调用该接口创建场景。
        /// 4.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 5.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="dlp_id">电视墙id，从获取电视墙大屏信息接口获取返回参数dlp_id, 必填</param>
        /// <param name="name">场景名称,不支持的特殊字符在ASCII码中的位置：1-8位，10-31位和127位。必填</param>
        /// <param name="device_scene">场景类型,1表示设备场景。 非1表示平台场景。必填</param>
        /// <returns><see cref="SceneList"/></returns>
        public async Task<ResParameter<SceneList>?> TVWallSeceneAddAsync(int dlp_id, string name, int device_scene) =>
          await SecureCenterApis.PostAsync<SceneList>("/api/tvms/v1/public/tvwall/scene/addition", 1.4, new { dlp_id = dlp_id, name = name, device_scene = device_scene });
        /// <summary>
        /// 场景修改 /api/tvms/v1/public/tvwall/scene/update
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.场景已存在
        /// 4.调用该接口修改或者保存场景
        /// 5.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 6.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="scene_id">场景id，从获取电视墙场景列表信息接口获取返回参数scene_id 必填</param>
        /// <param name="name">场景名称,不支持的特殊字符在ASCII码中的位置：1-8位，10-31位和127位。必填</param>
        /// <returns><see cref="SceneList"/></returns>
        public async Task<ResParameter<SceneList>?> TVWallSeceneUpdateAsync(int scene_id, string name) =>
          await SecureCenterApis.PostAsync<SceneList>("/api/tvms/v1/public/tvwall/scene/update", 1.4, new { scene_id = scene_id, name = name });
        /// <summary>
        /// 场景删除 /api/tvms/v1/public/tvwall/scene/deletion
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.场景已存在。
        /// 4.调用该接口删除场景。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="scene_id">场景id，从获取电视墙场景列表信息接口获取返回参数scene_id 必填</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<ResError>?> TVWallSeceneDelAsync(int scene_id) =>
          await SecureCenterApis.PostAsync<ResError>("/api/tvms/v1/public/tvwall/scene/deletion", 1.4, new { scene_id = scene_id });
        /// <summary>
        /// 场景另存为 /api/tvms/v1/public/tvwall/scene/saveAs
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.场景已存在
        /// 4.调用该接口另存为场景。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="name">必填 场景名称,不支持的特殊字符在ASCII码中的位置：1-8位，10-31位和127位。</param>
        /// <param name="dlp_id">必填 电视墙id，从获取电视墙大屏信息接口获取返回参数dlp_id</param>
        /// <param name="scene_id">必填 场景id，从获取电视墙场景列表信息接口获取返回参数scene_id</param>
        /// <param name="device_scene">必填 场景类型，1表示设备场景。 非1表示平台场景。</param>
        /// <param name="copy_cycle">非必填 是否复制场景下的轮巡，默认不复制，1 复制； 非1不复制</param>
        /// <param name="copy_cycle_list">非必填 需要复制的轮巡id列表，中间用逗号隔开，不填则默认全部复制，该参数在copy_cycle存在时才生效</param>
        /// <returns><see cref="SceneList"/></returns>
        public async Task<ResParameter<SceneList>?> TVWallSeceneSaveAsAsync(string name, int dlp_id, int scene_id, int device_scene,
            int copy_cycle = 0, string copy_cycle_list = null) =>
          await SecureCenterApis.PostAsync<SceneList>("/api/tvms/v1/public/tvwall/scene/saveAs", 1.3, new
          {
              name = name,
              dlp_id = dlp_id,
              scene_id = scene_id,
              device_scene = device_scene,
              copy_cycle = copy_cycle,
              copy_cycle_list = copy_cycle_list
          });
        /// <summary>
        /// 电视墙场景切换 /api/tvms/v1/tvwall/scene/switch
        /// 1.在电视墙客户端配置电视墙的场景信息。
        /// 2.获取电视墙所有的场景列表信息。
        /// 3.进行场景切换。
        /// 4.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 5.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="scene_id">必填 场景id，从获取电视墙场景列表信息接口获取返回参数scene_id</param>
        /// <returns><see cref="SceneList"/></returns>
        public async Task<ResParameter<SceneList>?> TVWallSeceneSwitchAsync(int scene_id) =>
          await SecureCenterApis.PostAsync<SceneList>("/api/tvms/v1/tvwall/scene/switch", 1.2, new { scene_id = scene_id });
        /// <summary>
        /// 新增报警 /api/tvms/v1/public/tvwall/alarm/addition
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.窗口已存在且已设置为报警窗口
        /// 4.调用该接口进行报警上墙
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">报警信息</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<object>?> TVWallAlarmAddAsync(ReqTVWallAlarmAdd req) =>
          await SecureCenterApis.PostAsync<object>("/api/tvms/v1/public/tvwall/alarm/addition", 1.4, req);
        /// <summary>
        /// 删除报警 /api/tvms/v1/public/tvwall/alarm/deletion
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.窗口已存在且设置为报警窗口
        /// 4.当前报警正在报警上墙
        /// 5.调用该接口停止报警上墙
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">查询参数</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<object>?> TVWallAlarmDelAsync(int event_index) =>
          await SecureCenterApis.PostAsync<object>("/api/tvms/v1/public/tvwall/alarm/deletion", 1.4, new { event_index = event_index });
        /// <summary>
        /// 窗口批量创建 /api/tvms/v1/public/tvwall/floatWnds/addition
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上
        /// 3.调用该接口进行窗口创建
        /// 4.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 5.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">窗口信息列表</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<ResTVWallFloatWnd>?> TVWallFloatWndsAddAsync(IList<ReqTVWallFloatWnd> req) =>
          await SecureCenterApis.PostAsync<ResTVWallFloatWnd>("/api/tvms/v1/public/tvwall/floatWnds/addition", 1.4, new { floatwnd_list = req });
        /// <summary>
        /// 窗口批量删除 /api/tvms/v1/public/tvwall/floatWnds/deletion
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.窗口已存在
        /// 4.调用该接口删除窗口
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">窗口信息列表</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<IList<ResError>>?> TVWallFloatWndsDelAsync(IList<ReqTVWallFloatWndsDel> req) =>
          await SecureCenterApis.PostAsync<IList<ResError>>("/api/tvms/v1/public/tvwall/floatWnds/deletion", 1.4, new { floatwnd_list = req });
        /// <summary>
        /// 窗口放大 /api/tvms/v1/public/tvwall/floatWnd/zoomIn
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.窗口已存在
        /// 4.调用该接口进行窗口放大
        /// 5.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 6.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="dlp_id">必填 电视墙id，从获取电视墙大屏信息接口获取返回参数dlp_id</param>
        /// <param name="floatwnd_id">必填 窗口id，从获取电视墙大屏信息接口获取返回参数id</param>
        /// <param name="wnd_uri">必填 窗口uri，从获取电视墙大屏信息接口获取返回参数wnd_uri</param>
        /// <param name="type">非必填 操作类型,全屏：full_screen 放大到全屏时必填，不填或者其他值时（如normal）为普通放大</param>
        /// <returns><see cref="FloatwmdList"/></returns>
        public async Task<ResParameter<FloatwmdList>?> TVWallFloatWndZoomInAsync(int dlp_id, int floatwnd_id, string wnd_uri, string type = null) =>
          await SecureCenterApis.PostAsync<FloatwmdList>("/api/tvms/v1/public/tvwall/floatWnd/zoomIn", 1.4, new
          {
              dlp_id = dlp_id,
              floatwnd_id = floatwnd_id,
              wnd_uri = wnd_uri,
              type = type
          });
        /// <summary>
        /// 窗口漫游 /api/tvms/v1/public/tvwall/floatWnd/move
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.窗口已存在
        /// 4.调用该接口对窗口进行漫游
        /// 5.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 6.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="dlp_id">必填 电视墙id，从获取电视墙大屏信息接口获取返回参数dlp_id</param>
        /// <param name="floatwnd_id">必填 窗口id，从获取电视墙大屏信息接口获取返回参数id</param>
        /// <param name="wnd_left">必填 坐标left</param>
        /// <param name="wnd_top">必填 坐标top</param>
        /// <param name="wnd_width">必填 宽（单位：LCD是按电视墙比例，LED是像素,注意LCD和LED的区别：
        /// LCD：宽为1 ~128*电视墙列数
        /// LED：宽为输出通道分辨率* 电视墙列数</param>
        /// <param name="wnd_height">必填 高（单位：LCD是按电视墙比例，LED是像素,注意LCD和LED的区别：
        /// LCD：高为1 ~128*行电视墙数
        /// LED：高为输出通道分辨率* 电视墙行数</param>
        /// <returns><see cref="FloatwmdList"/></returns>
        public async Task<ResParameter<FloatwmdList>?> TVWallFloatWndMoveAsync(int dlp_id, int floatwnd_id, int wnd_left,
            int wnd_top, int wnd_width, int wnd_height) => await SecureCenterApis.PostAsync<FloatwmdList>("/api/tvms/v1/public/tvwall/floatWnd/move", 1.4, new
            {
                dlp_id = dlp_id,
                floatwnd_id = floatwnd_id,
                wnd_left = wnd_left,
                wnd_top = wnd_top,
                wnd_width = wnd_width,
                wnd_height = wnd_height
            });

        /// <summary>
        /// 窗口置顶或置底 /api/tvms/v1/public/tvwall/floatWnd/layerCtrl
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.窗口已存在
        /// 4.调用该接口设置窗口置顶/底
        /// 5.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 6.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="dlp_id">必填 电视墙id，从获取电视墙大屏信息接口获取返回参数dlp_id</param>
        /// <param name="floatwnd_id">必填 窗口id，从获取电视墙大屏信息接口获取返回参数id</param>
        /// <param name="layer_ctrl">必填 操作类型,1置顶,非1置底</param>
        /// <returns><see cref="FloatwmdList"/></returns>
        public async Task<ResParameter<FloatwmdList>?> TVWallFloatWndlayerCtrlAsync(int dlp_id, int floatwnd_id, int layer_ctrl) =>
          await SecureCenterApis.PostAsync<FloatwmdList>("/api/tvms/v1/public/tvwall/floatWnd/layerCtrl", 1.4, new
          {
              dlp_id = dlp_id,
              floatwnd_id = floatwnd_id,
              layer_ctrl = layer_ctrl
          });
        /// <summary>
        /// 窗口还原 /api/tvms/v1/public/tvwall/floatWnd/zoomOut
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.窗口已放大
        /// 4.调用该接口进行窗口还原
        /// 5.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 6.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="dlp_id">必填 电视墙id，从获取电视墙大屏信息接口获取返回参数dlp_id</param>
        /// <param name="floatwnd_id">必填 窗口id，从获取电视墙大屏信息接口获取返回参数id</param>
        /// <returns><see cref="FloatwmdList"/></returns>
        public async Task<ResParameter<FloatwmdList>?> TVWallFloatWndZoomOutAsync(int dlp_id, int floatwnd_id) =>
          await SecureCenterApis.PostAsync<FloatwmdList>("/api/tvms/v1/public/tvwall/floatWnd/zoomOut", 1.4, new
          {
              dlp_id = dlp_id,
              floatwnd_id = floatwnd_id
          });
        /// <summary>
        /// 窗口分割 /api/tvms/v1/public/tvwall/floatWnd/division
        /// 1.添加解码器和电视墙
        /// 2.关联输出通道至电视墙上。
        /// 3.窗口已存在
        /// 4.调用该接口进行窗口分割
        /// 5.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 6.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="dlp_id">必填 电视墙id，从获取电视墙大屏信息接口获取返回参数dlp_id</param>
        /// <param name="floatwnd_id">必填 窗口id，从获取电视墙大屏信息接口获取返回参数id</param>
        /// <param name="div_num">必填 分割数，支持：1、2、4、6、8、9、12、16、25、36</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<FloatwmdList>?> TVWallFloatWndDivisionAsync(int dlp_id, int floatwnd_id, int div_num) =>
          await SecureCenterApis.PostAsync<FloatwmdList>("/api/tvms/v1/public/tvwall/floatWnd/division", 1.4, new
          {
              dlp_id = dlp_id,
              floatwnd_id = floatwnd_id,
              div_num = div_num
          });
        /// <summary>
        /// 非开窗设备窗口分割 /api/tvms/v1/public/tvwall/monitor/division
        /// 1.添加解码器和电视墙。
        /// 2.关联输出通道至电视墙上。
        /// 3.调用该接口进行分割
        /// 4.电视墙接口返回参数众多，文档只给出足够支撑业务的关键返回参数。
        /// 5.当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="dlp_id">必填 电视墙id，从获取电视墙大屏信息接口获取返回参数dlp_id</param>
        /// <param name="monitor_pos">监视器pos,从获取电视墙大屏信息接口获取返回参数pos</param>
        /// <param name="div_num">必填 分割数，支持：1、2、4、6、8、9、12、16、25、36</param>
        /// <returns><see cref="ResRecordList"/></returns>
        public async Task<ResParameter<ResTVWallFloatWndMonitorDivision>?> TVWallFloatWndMonitorDivisionAsync(int dlp_id, int monitor_pos, int div_num) =>
          await SecureCenterApis.PostAsync<ResTVWallFloatWndMonitorDivision>("/api/tvms/v1/public/tvwall/monitor/division", 1.4, new
          {
              dlp_id = dlp_id,
              monitor_pos = monitor_pos,
              div_num = div_num
          });
    }
}
